<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>async&await</title>
</head>
<body>
<script>
    /*
    * ES7语法
    *
    * async
    *   可以作用在任何的方法前, 返回值是一个promise对象;
    *   函数内部return的返回值, 会成为then回调函数的参数
    *   如果函数内部出现错误, 会被then的第二个参数或者catch捕获到
    *
    * await
    *   只能在async修饰下的方法中出现,普通函数内部直接写会报错  :await is only valid in async function
    *   正常情况下 await后面跟的是一个 promise对象, 返回该对象的结果
    *   如果await后面不是promise, 直接返回对应的值
    *   await会阻塞代码执行
    *
    *
    *
    * 是generator和promise的语法糖
    *   感觉像是在写同步代码一样
    *
    * */

    let fn0 = async ()=>{

    };
    let arr = [];
    arr.map(async (item ,index)=>{});
/*    async function fn1(){
//        throw new Error("手动抛出错误");
        return 100
    }*/
    {
/*        async function fn1(){
            return await 1+1;
        }

        console.log(fn1());//100?
        fn1().then((a)=>{
            console.log(a)//100
        },err=>{
            console.log("err--->", err)
        }).catch((cat)=>{
            console.log("cat--->", cat)
        })*/
    }
    {
/*        async function fn1(){
            let a =  await new Promise((resolve, reject)=>{
                    resolve(100)
                });
            console.log(a);
            return a
        }
        fn1();*/
    }
    {
        let p1 = ()=> new Promise((resolve, reject)=>resolve("hello"));

        function fn() {
            p1().then(
                res=>{
                    console.log("step1_1", res);
                }
            );
            console.log("step1_2")
        }
        fn();
//        step1_2
//        step1_1 hello
    }
    {
        let p1 = ()=> Promise.resolve("hello");
//        let p1 = ()=> Promise.reject("hello");
        async function fn() {
//            let res = p1();
            let res = await p1();
            //感觉像是在写同步代码一样
            //await 智能接受resolve的结果.
            console.log("step2_1", res);
            console.log("step2_2")
        }
        fn()
    }


    {
//        let p1 = ()=> Promise.reject("hello");
        let p1 = ()=> Promise.resolve("hello");
        async function fn() {
            //即使前面异步操作出现问题,但是不影响代码继续执行
            try {
                let res = await p1();
                console.log("step3_1", res);
            }catch (e){//捕获到的错误 e
                console.log("step3_2___catch", e)
            }
            return await 110;
        }
        fn().then(
            res=>{
                console.log("step3_then方法", res)
            }
        )
    }

</script>
</body>
</html>